package com.v2.k18;

import java.util.Arrays;
import java.util.List;

/**
 * 测试lambda表达式1
 * http://blog.oneapm.com/apm-tech/226.html
 * Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确，但现在姑且这么认为)，
 * 简单地说，它是没有声明的方法，也即没有访问修饰符、返回值声明和名字。
 * Java 中的 Lambda 表达式通常使用 (argument) -> (body) 语法书写，例如：
 * (arg1, arg2...) -> { body }
 * (type1 arg1, type2 arg2...) -> { body }
 *
 * 让我们了解一下 Lambda 表达式的结构。
 *
 * 一个 Lambda 表达式可以有零个或多个参数
 * 参数的类型既可以明确声明，也可以根据上下文来推断。例如：(int a)与(a)效果相同
 * 所有参数需包含在圆括号内，参数之间用逗号相隔。例如：(a, b) 或 (int a, int b) 或 (String a, int b, float c)
 * 空圆括号代表参数集为空。例如：() -> 42
 * 当只有一个参数，且其类型可推导时，圆括号（）可省略。例如：a -> return a*a
 * Lambda 表达式的主体可包含零条或多条语句
 * 如果 Lambda 表达式的主体只有一条语句，花括号{}可省略。匿名函数的返回类型与该主体表达式一致
 * 如果 Lambda 表达式的主体包含一条以上语句，则表达式必须包含在花括号{}中（形成代码块）。
 * 匿名函数的返回类型与代码块的返回类型一致，若没有返回则为空
 *
 */
public class Test {

	public static void main(String[] args) {

		// lambda表达式的简单例子:
//		// 1. 不需要参数,返回值为 5
//		() -> 5
//		// 2. 接收一个参数(数字类型),返回其2倍的值
//		x -> 2 * x
//		// 3. 接受2个参数(数字),并返回他们的差值
//		(x, y) -> x – y
//		// 4. 接收2个int型整数,返回他们的和
//		(int x, int y) -> x + y
//		// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
//		(String s) -> System.out.print(s)

		String[] atp = {"Rafael Nadal", "Novak Djokovic",
				"Stanislas Wawrinka",
				"David Ferrer","Roger Federer",
				"Andy Murray","Tomas Berdych",
				"Juan Martin Del Potro"};
		List<String> players =  Arrays.asList(atp);

		players.forEach(aa-> System.out.println(aa));

	}

}
